

package cn.ydxiaoshaui.aip.imageprocess;

import cn.ydxiaoshaui.aip.client.BaseClient;
import cn.ydxiaoshaui.aip.error.AipError;
import cn.ydxiaoshaui.aip.http.AipRequest;
import cn.ydxiaoshaui.aip.http.EBodyFormat;
import cn.ydxiaoshaui.aip.http.Headers;
import cn.ydxiaoshaui.aip.http.HttpContentType;
import cn.ydxiaoshaui.aip.util.Base64Util;
import cn.ydxiaoshaui.aip.util.Util;
import com.alibaba.fastjson.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AipImageProcess extends BaseClient {

    public AipImageProcess(String appId, String apiKey, String secretKey) {
        super(appId, apiKey, secretKey);
    }

    /**
     * 图像无损放大接口   
     * 输入一张图片，可以在尽量保持图像质量的条件下，将图像在长宽方向各放大两倍。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject imageQualityEnhance(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);
        
        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(ImageProcessConsts.IMAGE_QUALITY_ENHANCE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 图像无损放大接口
     * 输入一张图片，可以在尽量保持图像质量的条件下，将图像在长宽方向各放大两倍。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject imageQualityEnhance(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return imageQualityEnhance(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

    /**
     * 图像去雾接口   
     * 对浓雾天气下拍摄，导致细节无法辨认的图像进行去雾处理，还原更清晰真实的图像。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject dehaze(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);
        
        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(ImageProcessConsts.DEHAZE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 图像去雾接口
     * 对浓雾天气下拍摄，导致细节无法辨认的图像进行去雾处理，还原更清晰真实的图像。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject dehaze(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return dehaze(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

    /**
     * 图像对比度增强接口   
     * 调整过暗或者过亮图像的对比度，使图像更加鲜明。
     *
     * @param image - 二进制图像数据
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject contrastEnhance(byte[] image, HashMap<String, String> options) {
        AipRequest request = new AipRequest();
        preOperation(request);
        
        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(ImageProcessConsts.CONTRAST_ENHANCE);
        postOperation(request);
        return requestServer(request);
    }

    /**
     * 图像对比度增强接口
     * 调整过暗或者过亮图像的对比度，使图像更加鲜明。
     *
     * @param image - 本地图片路径
     * @param options - 可选参数对象，key: value都为string类型
     * options - options列表:
     * @return JSONObject
     */
    public JSONObject contrastEnhance(String image, HashMap<String, String> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return contrastEnhance(data, options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }
    /**
     * 图像修复接口
     * 去除图片中不需要的遮挡物，并用背景内容填充，提高图像质量。
     *
     * @param image - 二进制图像数据
     * @param inpainting_type -  选择修复类型的参数，“mask“和” rectangle“二选一。
     * @param options - 可选必选参数对象，key: value都为string类型
     * options - options列表:
     *           mask和rectangle二选一
     *           mask 要去除的位置不规则时，上传mask图片（base64编码）。输入的mask文件只能是png格式的黑白图片，缺损部位用0（黑色）表示，完好部分用255（白色）表示，不能有0、255之外的其他值。mask的大小和image大小必须一致。
     *           rectangle 要去除的位置为规则矩形时，给出坐标信息，每个元素包含left, top, width, height，int 类型。
     * @return JSONObject
     */
    public JSONObject inpainting(byte[] image, String inpainting_type,HashMap<String, Object> options) {
        AipRequest request = new AipRequest();
        preOperation(request);

        String base64Content = Base64Util.encode(image);
        request.addBody("image", base64Content);
        request.addBody("inpainting_type", inpainting_type);
        if (options != null) {
            request.addBody(options);
        }
        request.setUri(ImageProcessConsts.INPAINTING);
        request.addHeader(Headers.CONTENT_TYPE, HttpContentType.JSON_DATA);
        request.setBodyFormat(EBodyFormat.RAW_JSON);
        System.out.println(request.getBodyStr());
        postOperation(request);
        return requestServer(request);
    }
    /**
     * 图像修复接口
     * 去除图片中不需要的遮挡物，并用背景内容填充，提高图像质量。
     *
     * @param image - 本地图片路径
     * @param inpainting_type -  选择修复类型的参数，“mask“和” rectangle“二选一。
     * @param options - 可选必选参数对象，key: value都为string类型
     * options - options列表:
     *           mask和rectangle二选一
     *           mask 要去除的位置不规则时，上传mask图片（base64编码）。输入的mask文件只能是png格式的黑白图片，缺损部位用0（黑色）表示，完好部分用255（白色）表示，不能有0、255之外的其他值。mask的大小和image大小必须一致。
     *           rectangle 要去除的位置为规则矩形时，给出坐标信息，每个元素包含left, top, width, height，int 类型。
     * @return JSONObject
     */
    public JSONObject inpainting(String image, String inpainting_type,HashMap<String, Object> options) {
        try {
            byte[] data = Util.readFileByBytes(image);
            return inpainting(data,inpainting_type,options);
        } catch (IOException e) {
            e.printStackTrace();
            return AipError.IMAGE_READ_ERROR.toJsonResult();
        }
    }

}